<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>逻辑运算符</title>
</head>
<body>
    
</body>
</html>
<script>
    /*
        JS中为我们提供了三种逻辑运算符

        && 与
            - && 可以对符号两侧的值进行与运算并返回结果
            - 运算规则
                - 两个值中只要有一个值为false就返回false
                    只有两个值都为 true 时，才会返回true
                - JS中的 "与" 属于短路的与，
                    如果第一个值为false，则不会看第二个值

            - 白话 : “与” 运算 是找false，只要有一个false，就返回false
        
        || 或
            - || 可以对符号两侧的值进行 或 运算，并返回结果
            - 运算规则 ：
                - 两个值中只要有一个 true ，就返回true
                    如果两个值都为 false，才返回false
                - JS中的 "或" 属于短路的或
            - 白话 : “或” 运算 是找true，只要有一个true，就返回true

        !  非
            - ! 可以用来对一个值进行非运算
            - 所谓 非 运算就是对一个布尔值进行取反操作，
                true 变 false   false 变 true
            - 如果对一个值进行两次取反，他不会变化
            - 如果对非布尔值进行运算，则会将其转换为布尔值，然后再取反
                我们可以利用该特点，来将一个其他的数据类型转换为布尔值
                可以为一个任意数据类型取两次反，来将其转换为布尔值
                原理和 Boolean() 函数一样
    */

    // =================== 或 ============================
    //两个都是 false 则返回false
    let c = false || false;

    //只要有一个是 true ，就返回 true
    c = true || true;
    c = true || false;
    c = false || true;
    console.log("c = "+c);

    // ====== 或 （）扩展=========
        /*第一个值为false，则会检查第二个值*/
    false || alert("或运算:第一个值为false，是否会检查第二个值");
        /*第一个值为true，则不再检查第二个值*/
    true || alert("或运算:第一个值为true，是否会检查第二个值");


    // =================== 与 ============================
    // 如果两个值都是 true 则返回 true
    let result = true && true;

    //只要有一个 false ，就返回 false
    result = true  && false;
    result = false && true;
    result = false && false;
    console.log("result = "+result);

    // ====与 （扩展）====
    // 第一个值为 true 会检查第二个值
    //true  && alert("与:第一个值为true :是否能显示出来");

    // 第一个值为 false 不会检查第二个值
    false && alert("与:第一个值为false :是否能显示出来")

    
    // ==================== 非 ============================
    let a =false;
    //对a进行 非 运算
    a = !!a;
    console.log("a = "+a);
    let b = 10;
    b = !!b;
    console.log("b = "+b);
    console.log(typeof b);

</script>